package encoding.convert;

import info.monitorenter.cpdetector.io.ASCIIDetector;
import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;
import info.monitorenter.cpdetector.io.ParsingDetector;
import info.monitorenter.cpdetector.io.UnicodeDetector;

import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.Charset;

public class MyCpdetectorEncoding {

	public static Charset getEncoding(String filePath) throws Exception {
		/**
		 * detector是探测器，它把探测任务交给具体的探测实现类的实例完成。
		 * cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法加进来
		 * 如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector
		 * detector按照“谁最先返回非空的探测结果，就以该结果为准”的原则返回探测到的字符集编码 <br>
		 * 
		 * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于指示是否显示探测过程的详细信息，为false不显示
		 * JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码测定
		 * ASCIIDetector用于ASCII编码测定
		 * UnicodeDetector用于Unicode家族编码的测定
		 * 
		 */
		CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();

		// 如果不希望判断xml的encoding，而是要判断该xml文件的编码，则可以注释掉
		detector.add(new ParsingDetector(false));
		detector.add(JChardetFacade.getInstance());
		detector.add(ASCIIDetector.getInstance());
		detector.add(UnicodeDetector.getInstance());
		
		Charset charset = null;
		File f = new File(filePath);
		charset = detector.detectCodepage(f.toURI().toURL());
		// charset.name()
		return charset;
	}

	/**
	 * 判断文件的编码格式<br>
	 * 通过读取文本文件头信息，判断编码格式
	 */
	public static String getEncoding2(String filePath) throws Exception {
		FileInputStream fis = new FileInputStream(filePath);
		int p = (fis.read() << 8) + fis.read();
		fis.close();
		String encoding = "";
		switch (p) {
		case 0xefbb:
			encoding = "UTF-8";
			break;
		case 0xfffe:
			encoding = "Unicode";
			break;
		case 0xfeff:
			encoding = "UTF-16BE";
			break;
		default:
			encoding = "GBK";
		}
		return encoding;
	}
}
